
package clima;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

/**
 *
 * @author  andres
 */
public class AlgoritmosPronostico {
    int cont = 0;
    float alfa= (float) 0.1;                 
    ArrayList<ForecastValues> valores= new ArrayList<ForecastValues>();
    
    
    public void ingresarValores(ForecastValues valor){
        
        valores.add(cont, valor);
        cont++;
    }// fin metodo ingresar
    
    public float ExponentialSmoothing(){
        ForecastValues total1= new ForecastValues(0);
        ForecastValues aux2;
        ForecastValues aux = valores.get(0);
        valores.add(valores.size(),total1);       
        aux.pronostico= aux.reporte;
        valores.set(0, aux);
          
        for (int i = 1; i <valores.size(); i++) {
          
            aux=valores.get(i);
            aux2 = valores.get(i-1);
            aux.pronostico=aux2.pronostico + alfa * (aux2.reporte-aux2.pronostico);
            valores.set(i, aux);
                           
        }
        
        total1= valores.get(valores.size()-1);
        return total1.pronostico;
       
    }//fin  metodo  ExponentialSmoothing
    
      public float DoubleExponentialSmoothing() {
            ExponentialSmoothing();
            ForecastValues aux1= valores.get(0);
            ForecastValues aux2;
            
            aux1.pronosticoDoubleEx= aux1.pronostico;
            valores.set(0, aux1);
       
           for (int i = 1; i < valores.size(); i++) {
           
            aux1= valores.get(i);
            aux2 = valores.get(i-1);
            aux1.pronosticoDoubleEx = alfa*aux2.pronostico+
                    ((1-alfa)*aux2.pronosticoDoubleEx);
           }
            aux1= valores.get(valores.size()-1);
       
       return aux1.pronosticoDoubleEx;
       }
    
    
  
   
   public float error(int tipoAlgoritmo){
       
       float sumatoria = 0;
       ForecastValues va;
       
       if (tipoAlgoritmo==1){   //ERROR DE ALGORITMO ExponentialSmoothing
           for (int i = 0; i < valores.size()-1; i++) {
              va= valores.get(i);
              sumatoria = sumatoria + Math.abs((va.reporte-va.pronostico)/va.reporte);     
           }   
           System.out.println(sumatoria);
        }//final  xponentialSmoothing
       
       if (tipoAlgoritmo==2){   //ERROR DE ALGORITMO DoubleExponentialSmoothing
           for (int i = 0; i < valores.size()-1; i++) {
              va= valores.get(i);
              sumatoria = sumatoria + Math.abs((va.pronostico-va.pronosticoDoubleEx)/va.pronostico);     
           }   
           System.out.println(sumatoria);
       }
       
            
       return (sumatoria*100) / valores.size();
   }
   
    
    // Main para probar metodos ExponentialSmoothing y DoubleExponentialSmoothing
     public static void main(String[] args) throws IOException {
       
        Scanner lector = new Scanner(System.in);
         AlgoritmosPronostico algo = new AlgoritmosPronostico();
         for (int i = 1; i <13; i++) {
             
             ForecastValues v = new ForecastValues(lector.nextFloat());
             
            algo.ingresarValores(v);
             
         }
        
         System.out.println( algo.ExponentialSmoothing());
         System.out.println(algo.DoubleExponentialSmoothing());
         System.out.println(algo.error(1));
         System.out.println(algo.error(2));
     
     }//fin main      
    
     
}//fin  clase algoritmos
